package ma.moliere.persistance.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import ma.moliere.persistance.IParametragePersistance;
import ma.moliere.persistance.oe.Anneescolaire;
import ma.moliere.persistance.oe.Classe;
import ma.moliere.persistance.oe.CompteurGroupe;
import ma.moliere.persistance.oe.Enseignant;
import ma.moliere.persistance.oe.Groupe;
import ma.moliere.persistance.oe.Matiere;
import ma.moliere.persistance.oe.Tarif;
import ma.moliere.transverse.utils.ClasseUtil;
import ma.moliere.transverse.utils.TarifUtil;
import ma.moliere.transverse.vo.ClasseAffichee;
import ma.moliere.transverse.vo.TarifAffiche;

import org.apache.commons.collections.CollectionUtils;

@SuppressWarnings("unchecked")
public class ParametragePersistanceImpl implements IParametragePersistance, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4625328269419937133L;
	@PersistenceContext
	private EntityManager entityManager;

	@Override
	public ClasseAffichee ajouterClasse(final ClasseAffichee pClasse) {
		Classe entite = ClasseUtil.copieVoVersOe(pClasse);
		entityManager.persist(entite);
		entityManager.clear();
		return ClasseUtil.copieOeVersVo(entite);
	}

	@Override
	public ClasseAffichee modifierClasse(final ClasseAffichee pClasse) {
		Classe entite = ClasseUtil.copieVoVersOe(pClasse);
		entityManager.merge(entite);
		entityManager.flush();
		return ClasseUtil.copieOeVersVo(entite);
	}

	@Override
	public List < ClasseAffichee > rechercherClasses() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT classe FROM Classe classe ");
		vRequete.append(" WHERE 1=1");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Classe > resultats = vQuery.getResultList();
		final List < ClasseAffichee > resultatsfinals = new ArrayList < ClasseAffichee >();
		for (Classe classe : resultats) {
			resultatsfinals.add(ClasseUtil.copieOeVersVo(classe));
		}
		entityManager.clear();
		return resultatsfinals;

	}

	@Override
	public List < Anneescolaire > rechercherAnnees() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT annee FROM Anneescolaire annee ");
		vRequete.append(" WHERE 1=1");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Anneescolaire > resultats = vQuery.getResultList();
		entityManager.clear();

		return resultats;

	}

	@Override
	public ClasseAffichee rechercherClasseParId(final Long id) {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT classe FROM Classe classe ");
		vRequete.append(" WHERE classe.id=");
		vRequete.append("'" + id + "'");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Classe > resultats = vQuery.getResultList();
		entityManager.clear();
		return ClasseUtil.copieOeVersVo(resultats.get(0));
	}

	@Override
	public Anneescolaire rechercherAnneeParId(final Long id) {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT annees FROM Anneescolaire annees ");
		vRequete.append(" WHERE annees.id=");
		vRequete.append("'" + id + "'");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Anneescolaire > resultats = vQuery.getResultList();
		entityManager.clear();

		return resultats.get(0);
	}

	@Override
	public Anneescolaire rechercherAnneeParLibelle(final String libelle) {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT annees FROM Anneescolaire annees ");
		vRequete.append(" WHERE annees.libelle=");
		vRequete.append("'" + libelle + "'");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		Anneescolaire resultats = (Anneescolaire) vQuery.getSingleResult();
		entityManager.clear();

		return resultats;
	}

	@Override
	public void supprimerClasse(final Long id) {
		// TODO Auto-generated method stub

	}

	@Override
	public void ajouterMatiere(final Matiere pMatiere) {
		entityManager.persist(pMatiere);
		entityManager.clear();

	}

	@Override
	public void modifierMatiere(final Matiere pMatiere) {
		entityManager.merge(pMatiere);
		entityManager.clear();

	}

	@Override
	public void supprimerMatiere(final Long id) {
		// TODO

	}

	@Override
	public List < Matiere > rechercherMatieres() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT module FROM Module module ");
		vRequete.append(" WHERE 1=1");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Matiere > resultats = vQuery.getResultList();
		entityManager.clear();

		return resultats;
	}

	@Override
	public void ajouterEnseignant(final Enseignant pEnseignant) {
		entityManager.persist(pEnseignant);
		entityManager.clear();

	}

	@Override
	public void modifierEnseignant(final Enseignant pEnseignant) {
		entityManager.merge(pEnseignant);
		entityManager.clear();

	}

	@Override
	public void supprimerEnseignant(final Long id) {
		// TODO Auto-generated method stub

	}

	@Override
	public List < Enseignant > rechercherEnseignants() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT enseignant FROM Enseignant enseignant ");
		vRequete.append(" WHERE 1=1");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Enseignant > resultats = vQuery.getResultList();
		entityManager.clear();
		return resultats;
	}

	@Override
	public List < Groupe > rechercherGroupePardIdClasse(final Long idClasse) {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT groupe FROM Groupe groupe ");
		vRequete.append(" WHERE groupe.classeId=");
		vRequete.append("'" + idClasse + "'");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Groupe > resultats = vQuery.getResultList();
		entityManager.clear();
		return resultats;
	}

	@Override
	public CompteurGroupe incrementerCompteurGroupe(final CompteurGroupe compteur) {
		entityManager.persist(compteur);
		entityManager.clear();
		return compteur;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TarifAffiche ajouter(final TarifAffiche tarif) {
		Tarif entite = TarifUtil.copie(tarif);
		entityManager.persist(entite);
		entityManager.clear();
		return TarifUtil.copie(entite);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TarifAffiche modifier(final TarifAffiche tarif) {
		Tarif entite = TarifUtil.copie(tarif);
		entityManager.merge(entite);
		entityManager.flush();
		return TarifUtil.copie(entite);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ma.moliere.persistance.IParametragePersistance#rechercherTarifs()
	 */
	@Override
	public List < TarifAffiche > rechercherTarifs() {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT tarif FROM Tarif tarif ");
		vRequete.append(" WHERE 1=1");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Tarif > resultats = vQuery.getResultList();
		final List < TarifAffiche > resultatsfinal = new ArrayList < TarifAffiche >();
		for (Tarif entite : resultats) {
			resultatsfinal.add(TarifUtil.copie(entite));
		}
		entityManager.clear();
		return resultatsfinal;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final TarifAffiche rechercherTarif(final String classe) {
		final StringBuilder vRequete = new StringBuilder();
		vRequete.append(" SELECT tarif FROM Tarif tarif ");
		vRequete.append(" WHERE 1=1");
		vRequete.append(" AND tarif.classe = ");
		vRequete.append("'" + classe + "'");
		vRequete.append(" AND tarif.datefin is null");
		vRequete.append(" AND tarif.etat = 'VALIDE'");
		final Query vQuery = entityManager.createQuery(vRequete.toString());
		final List < Tarif > resultats = vQuery.getResultList();
		TarifAffiche resultatsfinal = new TarifAffiche();
		if (CollectionUtils.isNotEmpty(resultats)) {
			resultatsfinal = TarifUtil.copie(resultats.get(0));
		}
		entityManager.clear();
		return resultatsfinal;
	}
}
